首页 > 试题广场 >

蛇形矩阵

[编程题]蛇形矩阵
  • 热度指数:169051 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

例如,当输入5时,应该输出的三角形为:

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11



输入描述:

输入正整数N(N不大于100)



输出描述:

输出一个N行的蛇形矩阵。

示例1

输入

4

输出

1 3 6 10
2 5 9
4 8
7
def snake_matrix(n):
    m=[[] for i in range(n)]
    k=0
    j=0
    ma=2
    while k<n:
        p=int(ma)
        j=0
        while j<n-k:
            if k==0 and j==0:
                m[k].append(1)
            elif j==0 and k>0:
                g=m[k-1][j]+p-2
                m[k].append(g)
            else:
                d=m[k][j-1]+p
                m[k].append(d)
                p+=1
            j+=1
        ma+=1
        k+=1
###最后发现while还是不如for好用,while只适合对次数有要求和限制的循环,很方便统计次数
    for i in range(n):
        print(' '.join(map(str,m[i])))
    #return m

n=int(input())
snake_matrix(n)

我的代码就是比较简单粗暴的方式来实现,有更好的方法也可以推荐一下,这里是while循环版本,for循环在这里更方便
发表于 2023-05-30 17:17:36 回复(0)
先求每一行的开头元素,然后开头元素从增量为2开始,每次加1;增量随行增加也加1
# 以2为起始,每次往上增1
# 下一行以3为开始,每次往上增1
# 每行的开头元素规律:以1开始,每次加1,2,3,4
n=int(input())
raw_start,x=[],1  # 每一行开头的元素
for i in range(1,n+1):
    raw_start.append(x)
    x=x+i
m=2  # 每行元素的增量
for j in range(len(raw_start)):
    x=raw_start[j]  # 记录开头行元素
    for k in range(n-j): # 每行总共n-j个元素
        print(x,end=' ')
        x=x+k+m
    m+=1
    print()


发表于 2022-09-13 21:56:03 回复(0)
N = int(input())
delta_y0 = 1
for x in range(1, N+1):
    row_list = []
    delta_y = delta_y0
    for y in range(1, N-x+2):
        row_list.append(str(delta_y))
        delta_y = delta_y + (x+y)
    print(" ".join(row_list))
    delta_y0 += x
发表于 2022-08-28 21:26:59 回复(0)
num = int(input())
lst=[]
for i in range(num):
    lst.append([0]*(num-i))
count = 1
for n in range(num):   
    for m in range(n+1):
        lst[n-m][m] = count
        count += 1
for i in range(num):
    print(' '.join(map(str,lst[i])))
发表于 2022-08-28 00:26:20 回复(0)
N = int(input())
li = []
for i in range(N):  # i表示行数
    s = (i+1)*i//2 + 1 # 初始化每行第一个数的大小,后续会增
    m = i+2 # 初始化每行前两个间隔数的差值,后续间隔数差值会变
    for j in range(N-i): # j表示每行的个数
        li.append(s)
        s += m
        m += 1
    li.append("\n") # 每行数加入完毕后,随便加个符号以便后续列表分行输出

li = [str(i) for i in li]
# print(li)
for j in li:
    if j != "\n":
        print(j, end=" ")
    else:
        print()
发表于 2022-08-25 00:53:17 回复(0)
n = int(input())
def a(n):
    return int((n*n-n+2)/2) 
for i in range(1,n+1):
    print(a(i),end=' ')
    c = i+1
    t = a(i)
    while c <= n:
        print(str( t + c ),end=' ')
        t += c        
        c += 1
    print() 
发表于 2022-08-16 17:00:07 回复(0)
n = int(input())
ls = [1,]
for i in range(0,n):
    ls.append(i)
    temp = sum(ls)
    print(temp,end=' ') 
    for j in range(i+2,n+1):
        temp += j
        print(temp,end=' ')
    print()

发表于 2022-08-11 17:44:48 回复(0)


# 递归的方法
下一种状态相当于上一种状态多加一行,然后原来的每行最后再多加一个数
可以先计算多加的一行(只有一个数),再依次+1计算原每行最后的加数
def hj35(n):
    if n == 1:
        res = [[1]]
        return res
    a_n_1 = hj35(n - 1)
    y_plus = n - 1  #第一列新加的数与上一个数的差值
    y_new = a_n_1[n - 2][0] + y_plus #第一列新加的数
    #利用每行最后一次依次+1,计算a_n_1每行最后需要加的数
    jump=1
    for i in a_n_1[::-1]: #倒序
        i.append(y_new + jump)
        jump += 1
    #第一列新加的数
    a_n_1.append([y_new])
    res = a_n_1
    return res


if __name__ == '__main__':

    a = int(input())
    res = hj35(a)
#遍历列表输出
    for i in res:
        for j in i:
            print(j, end=' ')
        print()



发表于 2022-08-06 19:58:11 回复(0)
先把蛇的尾巴算出来,  等于 n的二次方加n 除以 2
以n = 5 为例, 蛇尾= (5**2+5)//2 = 15,  再反过来画蛇

第零次: 15 10 6 3 1   -->   (15  15-5  15-5-4  15-5-4-3  15-5-4-3-2)  即在每次循环里先输出蛇尾, 再每次输出蛇尾和 n, n-1, n-2 ... 的累减
第一次: 14 9 5 2  -->  (14  14-5  14-5-4  14-5-4-3)  蛇尾在跑新的循环重置, 减去当前次数,  15 - 1 = 14
第二次: 13 8 4  -->  (13  13-5  13-5-4)
第三次: 12 7  -->  (12  12-5)
 第四次: 11  -->  (11)

跑完每行的循环把元素装进列表,   再将列表内的元素pop()弹出
n = int(input())
x = (n**2+n)//2  # 算出蛇尾
count = 0  # 第零次
list1 = []
for j in range(0, n):  # 输入多少就有多少行
    list1.append(x)  # 装入第一个元素
    for i in range(n, j+1, -1):  # 算出并装入之后的元素, 内循累减不能到最n(j)否则会出现0
        x -= i
        list1.append(x)  
    for k in range(len(list1)):  # pop()从尾部输出列表顺带清空
        print(list1.pop(), end=' ')
    print()
    count += 1
    x = (n**2+n)//2  # 重置蛇尾
    x -= count  # 新的循环蛇尾减次数
发表于 2022-08-02 23:43:47 回复(0)
def res(num, row, n):
    li = [num]
    if n == row:
        pass
    else:
        for i in range(row, n):
            num += i + 1
            li.append(num)
    print(' '.join(str(x) for x in li))

    
n = int(input())
num = 1
for row in range(1, n + 1):
    num += row - 1   
    res(num, row, n)

发表于 2022-07-28 15:30:29 回复(0)
n = int(input())
# 生成一个n*n矩阵
lst = []
# 无numpy库,循环生成
for i in range(n):
    lst.append([])
    for j in range(n):
        lst[i].append(0)
# 初始化第一个数
lst[0][0] = 1
# 初始化第0列
for i in range(1, n):
    lst[i][0] = lst[i-1][0] + i
# 从第一列开始,生成蛇形矩阵
i, j = 0, 1
for i in range(n):
    for j in range(1, n):
        if i+j < n:
            # 后一列 = 前一列+行数+列数+1
            lst[i][j] = lst[i][j-1] + i + j + 1
# 打印蛇形矩阵
for i in range(n):
    for j in range(n):
        # 上对角元素
        if i+j < n:
            # 每一行最后一个元素
            if i+j == n-1:
                print(int(lst[i][j]))
            # 每一行非最后元素
            else:
                print(int(lst[i][j]), end=' ')

发表于 2022-07-27 19:39:22 回复(0)
n = int(input())
rlist = []
for i in range(1, n + 1):
    tmp = (i**2 + i)//2
    rlist.append(tmp)
for j in range(n):
    print(*rlist)
    rlist = rlist[1:]
    rlist = [x - 1 for x in rlist]

发表于 2022-07-16 21:19:11 回复(0)
n = int(input())
row = []
value = 1
for i in range(1,n+1):
    row = []
    value_j = value
    for j in range(1,n+2-i):
        row.append(value_j)
        value_j = value_j+i+j
    value += i 
    print(' '.join(map(str,row)))

发表于 2022-07-16 04:21:52 回复(0)
n = int(input())
base = ["1"]
for i in range(n):
    if i == 0: continue
    base.append(str(int(base[i-1]) + i + 1))
while len(base) >= 1:
    print(' '.join(base))
    nl = []
    for i in range(len(base) - 1):
        nl.append(str(int(base[i + 1]) - 1))
    base = nl
发表于 2022-07-03 19:30:53 回复(0)
#递归
def dp(N):
    if N == 1:
        return [[1]]
    else:
        new = dp(N-1)
        for i in new:
            i.append(i[-1]+N)
        new.append([new[-1][0]+N-1])
        return new

N = int(input())
for i in dp(N):
    print(' '.join(map(str, i)))

发表于 2022-06-30 01:07:14 回复(0)
n = int(input())
list1 = []
temp = 1
for i in range(n):
    temp_list = []
    temp = temp + i
    temp_list.append(temp)
    count = 2 + i
    for k in range(1,n-i):
        temp2 = temp_list[-1] +count
        count += 1
        temp_list.append(temp2)
    list1.append(temp_list)
for i in list1:
    print(" ".join(str(n) for n in i))

发表于 2022-06-28 13:42:23 回复(0)
奉劝各位老铁不要用二维数组,用小学找规律就行了

n = int(input())
rowOne = 0
for i in range(n):
    curnum = rowOne
    line = []
    for j in range(i, n):
        curnum += j + 1
        line.append(str(curnum))
    print(" ".join(line))
    rowOne += if


发表于 2022-06-18 21:30:44 回复(0)